package main

import (
	"fmt"
	"sync"
)

var once sync.Once
var testmap map[string] int32

// 对testmap进行初始化的函数
func loadTestmap() {
	testmap = map[string] int32{
		"k1": 1,
		"k2": 2,
		"k3": 3,
	}
}

// 获取testmap对应key的值，如果没有初始化，会先执行初始化
// 书上说这个函数是并发安全的，这里的map初始化之后，内容不会再变
func getKey(key string) int32 {
	once.Do(loadTestmap)
	// 最后的return这句可能不是并发安全的，不过线程安全的map不是这里的重点
	// 假定这里的map在初始化之后只会被多个goroutine读取，其内容不会再改变
	return testmap[key]
}

func main() {
	fmt.Println(getKey("k1"))
}